#ifndef SQLITECONNECTPOOL_H
#define SQLITECONNECTPOOL_H
#include <QSqlDatabase>
#include <QQueue>
#include <QMutex>
#include <QMutexLocker>
#include <QWaitCondition>
/**
 * 数据库连接池类
 * 单例模式，通过双重判断来创建实例，通过将默认构造函数私有化来实现单例
 * 主要支持数据库连接的获取/归还
 *
 */

class SqliteConnectPool
{
public:
    /**
     * @brief 获取数据库连接，从连接池中获取一个可用数据库连接
     */
    static QSqlDatabase getConnection();

    /**
     * @brief 释放数据库连接，将数据库连接归还给连接池
     * @param connection: 待归还的数据库连接
     */
    static void releaseConnection(QSqlDatabase connection);

private:
    /**
     * @brief 获取连接池实例
     */
    static SqliteConnectPool& getInstance();
    ~SqliteConnectPool();

    SqliteConnectPool();
    SqliteConnectPool(const SqliteConnectPool& other);
    SqliteConnectPool& operator=(const SqliteConnectPool& other);

    /**
     * @brief 根据连接名称创建数据库连接，如果已存在则返回连接，不存在则创建后返回
     * @param connectName: 数据库连接名称
     */
    QSqlDatabase createConnection(const QString &connectName);

private:
    QQueue<QString> usedConnectionNames;        /** 在使用的数据库连接名称 */
    QQueue<QString> unusedConnectionNames;      /** 未被使用的数据库连接名称 */

    QString         hostName;                   /** 主机名称 */
    QString         databaseName;               /** 数据库名称 */
    QString         username;                   /** 用户名 */
    QString         password;                   /** 密码 */
    QString         databaseType;               /** 数据库类型 */

    bool            testOnBorrow;
    QString         testOnBorrowSql;

    int             maxWaitTime;
    int             waitInterval;
    int             maxConnectionCount;

    static QMutex             mutex;
    static QWaitCondition     waitConnection;
    static SqliteConnectPool* instance;
};

#endif // SQLITECONNECTPOOL_H
